曾经有人跟我说我的包有bug,我都懒得理他。因为tidyr
的动词都是两套的,一套是给用户用的,一套加了下划线,是给写代码用的,这样用户竟然说我用了gather_
不行,得用gather
,所以我都不理他。
直到又有一个用户来讲这件事情:
Yes. Thank you for this package.
I had the same issues here. I think linked to modifications in {rlang} and {tidyr}.
gather_
is now deprecated so that you need to use more tidyeval withgather
. I propose:cols2 <- enquo(cols)
df <- tidyr::gather(data, "type", "value", !!cols2)Concerning
xvar
, I agree. I would do the same proposition:xvar <- as.character(mapping$x)[2]
说gather_
被deprecated了,事实上还没有,不过从文档上看,应该会在下一版本中deprecated,所以事实上我的代码还是没问题的,不过从长远看,还是得换成用rlang
的方式。因为你鬼知道那天就真的deprecated了。
另外两人都讲到了捕获x
变量的问题,这我也是真心觉得什么乱七八糟的,我给出例子,我的是对的,你们能给出例子吗?
for changing from
xvar <- as.character(mapping)['x']
toxvar <- as.character(mapping$x)[2]
, do you have any reproducible example?require(ggplot2)
Loading required package: ggplot2
as.character(aes(x=abc))['x']
x
"abc"
as.character(aes(x=abc)$x)
[1] "abc"
as.character(aes(x=abc)$x)[2]
[1] NAthanks @statnmap for the
rlang
part.
结果人家说了,他们在用开发版本的ggplot2
,开发版本的行为不一样。
I am using the dev version of {ggplot2}, this maybe a reason. Here are my outputs:
as.character(aes(x=abc))['x']
[ ] NA
as.character(aes(x=abc)$x)
[ ] "~" "abc"
as.character(aes(x=abc)$x)[2]
[ ] "abc"To allow your function to work for both versions, you can add a test on
xvar
like:xvar <- as.character(aes(x=abc))['x']
if (is.na(xvar)) {
xvar <- as.character(mapping$x)[2]
}
这下我服了!如果是ggplot2
的早期用户的话,都知道以前的theme
是叫opts
,后来换名字了,而且有些参数也改名字了。ggplot2
经过很长时间的0.x
版本之后,在经过大变动变成1.0.0
之后,大家以为成熟了吧,结果在出来1.0.1
之后,又进行了大的变动,然后直接版本号上升为2.0.0
。用base
画图的好处之一是你10年后的代码还能用,这句话我在《美化base plot》一文中讲过,但是用ggplot2
,鬼知道那天你的代码就挂了,当年出2.0.0
的时候,一堆包都挂了!上面提到的这一点,我想应该也会让很多包有bug。
还未发布的新版ggplot2
(v=2.2.2)将不推荐使用大家喜欢的aes_
了。
aes()
now supports quasiquotation so that you can use!!
,!!!
,
and:=
. This replacesaes_()
andaes_string()
which are now
soft-deprecated (but will remain around for a long time).
可不是只有ggplot2
才这样哦,前面提到了tidyr
,事实上hadley的包都有这问题,变动太快,api换了很让人头大。我只想用下面的GIF来表达我的心情:
这篇文章说到的包是scatterpie
,以前有文章介绍过,大家可以点击了解一下,让我们可以在地图上画饼图,当然更通用的办法可以使用我的另一个包ggimage
。